home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Wave.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  3KB  |  157 lines

  1. #include "stdafx.h"
  2.  
  3. #define WAV_DATA_OFFSET        44
  4. #define WAV_FMT_OFFSET        20
  5.  
  6. cWAV *wave = 0;
  7.  
  8. cWAV::cWAV(LPDIRECTSOUNDBUFFER _dsb, const char *_name)
  9. {
  10.     dsb = _dsb;
  11.     name = strdup(_name);
  12.     add_end((cList **)&wave);
  13. }
  14.  
  15. cWAV::~cWAV()
  16. {
  17.     free(name);    
  18.     dsb->Release();    
  19. }
  20.  
  21. static void create_add_file(const char *fn, const char *name)
  22. {
  23.     // Read the wave file
  24.  
  25.     int size;
  26.     char *d = read_file(fn, &size);
  27.  
  28.     // Open database file 
  29.  
  30.     CFile f;
  31.     
  32.     if (!f.Open("Wave.dat", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::shareExclusive))
  33.         error("Unable to open Wave.dat");
  34.  
  35.     f.SeekToEnd();
  36.  
  37.     // Write name of object + bytecount of string
  38.  
  39.     int l = strlen(name);        
  40.     f.Write(&l, sizeof(l));
  41.     f.Write(name, l);
  42.  
  43.     // Write WAVEFORMATEX block
  44.  
  45.     f.Write(d + WAV_FMT_OFFSET, sizeof(WAVEFORMATEX));
  46.  
  47.     // Write lenght of data
  48.  
  49.     size -= WAV_DATA_OFFSET;
  50.     f.Write(&size, sizeof(size));
  51.  
  52.     // Write data
  53.  
  54.     f.Write(d + WAV_DATA_OFFSET, size);
  55.  
  56.     // Release temporary space
  57.  
  58.     delete d;
  59. }
  60.  
  61. void cWAV::create_file()
  62. {
  63.     search_files("Wav", "*.WAV", create_add_file);
  64. }
  65.  
  66. void cWAV::load()
  67. {    
  68.     LPDIRECTSOUNDBUFFER dsb;    
  69.     DSBUFFERDESC dsbd;    
  70.     WAVEFORMATEX wf;    
  71.     char name[256], *d;
  72.     unsigned long s;
  73.     int size, l;        
  74.     void *ptr;
  75.     CFile f;    
  76.  
  77.     if (no_sound)
  78.         return;
  79.  
  80.     // Open wave file
  81.  
  82.     if (!f.Open("Wave.dat", CFile::modeRead | CFile::shareDenyWrite))
  83.         error("Unable to open Wave.dat");
  84.     
  85.     while (f.Read(&l, sizeof(l)) == sizeof(l))
  86.     {
  87.         // Read name
  88.         
  89.         f.Read(name, l);
  90.         name[l] = 0;
  91.  
  92.         // Read WAVEFORMATEX block
  93.  
  94.         f.Read(&wf, sizeof(WAVEFORMATEX));
  95.  
  96.         // Read size
  97.  
  98.         f.Read(&size, sizeof(size));
  99.  
  100.         // Create temporary buffer
  101.  
  102.         d = new char [size];
  103.  
  104.         // Read wave data
  105.  
  106.         f.Read(d, size);
  107.  
  108.         // Create sound buffer
  109.     
  110.         ZeroMemory(&dsbd, sizeof(dsbd));
  111.         dsbd.dwSize = sizeof(dsbd);
  112.         dsbd.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_STATIC;
  113.         dsbd.dwBufferBytes = size;
  114.         dsbd.lpwfxFormat = &wf;
  115.     
  116.         if (FAILED(DS->CreateSoundBuffer(&dsbd, &dsb, 0)))    
  117.             error("Unable to create sound buffer");
  118.     
  119.         // Lock the buffer
  120.  
  121.         if (FAILED(dsb->Lock(0, size, &ptr, &s, 0, 0, 0)))
  122.             error("Unable to lock sound buffer");
  123.     
  124.         // Copy data in the buffer
  125.  
  126.         memcpy(ptr, d, s);
  127.  
  128.         // Unlock the buffer
  129.     
  130.         if (FAILED(dsb->Unlock(ptr, size, 0, 0)))
  131.             error("Unable to unlock sound buffer");
  132.  
  133.         // Release temporary memory
  134.     
  135.         delete d;
  136.  
  137.         // Add to list
  138.  
  139.         new cWAV(dsb, name);
  140.     }
  141. }
  142.  
  143. cWAV *cWAV::get(char *fn)
  144. {
  145.     if (!no_sound)
  146.     {
  147.         for (cWAV *b = wave; b != 0; b = (cWAV *)b->next)
  148.             if (eq(fn, b->name))
  149.                 return b;
  150.             
  151.         error("Wave file %s not found", fn);
  152.     }
  153.     
  154.     return 0;
  155. }
  156.  
  157.